컴파일러로 점프!

컴파일러

//hello_world.c
#include <stdio.h>

void print_hello(){
	printf("Hello World?\n");
}

int main(){
	print_hello();
	printf("Hello World!\n");
}

매번 보는 C 언어 책 챕터 1에서 볼법한 Hello World! 출력하기 함수이다.

C 언어라는 프로그래밍 언어를 사용하면서 한 번도 hello_world.c 라는 파일에 있는 문자열들이 어떻게 Hello World!를 출력하는 하나의 프로그램으로 변하는지 관심을 가지는 사람은 많이 존재하지 않을 것이다.

또는 관심을 가지더라도 쉽게 다가가기 어려운 주제일 수 있다.

이 컴파일러 챕터는 컴파일러라는 주제를 이해하는 것을 목표로 한다.

그리고 실제로 제작하는 것까지 진행하는 것을 최종 목표로 삼는다.

언어?

우리는 프로그래밍 언어 라는 단어를 흔하게 사용한다, 그런데 이 언어라는 단어의 정체는 뭘까?

물론 우리는 언어학자가 아니므로 언어학의 시각으로 언어라는 단어를 해석할 필요는 없다.

그렇다면 다음과 같은 정의 중에서 우리 엔지니어들의 입맛에 잘 맞는 정의를 선택해 보자

Info

언어(言語)에 대한 정의는 여러 가지 시도가 있었다. 아래는 그러한 예의 일부이다.

  1. 사람들이 자신의 생각을 다른 사람들에게 나타내고 전달하기 위해 사용하는 체계.
  2. 사물, 행동, 생각, 그리고 상태를 나타내는 체계.
  3. 사람들 사이에 공유되는 의미들의 체계.
  4. 문법적으로 맞는 말의 집합.
  5. 언어 공동체 내에서 이해될 수 있는 말의 집합.

[출처 - https://ko.wikipedia.org/wiki/언어 ]

어느 정도 감이 오는가?

위 정의 중에서는 4번이 컴파일러라는 주제를 이해하기 위한 가장 적절한 정의라고 생각된다.

그렇다면 문법적으로 맞는 말이 무엇일까?

문법

우리가 정의하는 언어는 일정한 문법에 따라서 배열된 일정한 기호들의 집합을 언어라고 정의할 수 있다.

그렇다면 일정한 문법일정한 기호는 무엇일까?

사실 C언어를 수만 코드 이상 작성한 여러분들은 아마도 프로그램을 작성하라고 하면 몸이 본능적으로 다음과 같이 함수를 생각하지도 않고 작성할 것이다

int main(int argc, char* argv[]){
...
}

오! 만약 이 문장을 바로 적었다면 여러분은 자신의 모국어와 함께 C 언어라는 언어의 화자라고 보아도 무방할 것이다

함수 뜯어보기

그렇다면 위 함수를 뜯어보자, C언어를 배울 때 함수 선언에 대해서 우리는 보통 이렇게 배운다.

  1. 먼저 함수의 return 형식을 적는다
  2. 함수의 이름을 적는다
  3. 소괄호(()를 연다
  4. 함수에서 사용할 변수'들'을 적는다
    1. 변수는 '변수의 type' '변수명' '(,)' 의 형식으로 적는다
  5. 소괄호())를 닫는다
  6. 괄호({)를 연다
  7. 함수 내용을 작성한다
  8. 괄호(})를 닫는다

이 과정이 바로 문법에 맞게 언어를 사용하는 예시이다.

C 언어라는 언어에서 함수를 정의하고 싶으면 위의 문법에 맞게 언어를 사용하여야 한다.

마치 영어 (또는 다른 외국어를) 배울 때 지독하게 외웠던 to 부정사, 동사의 3단 변화 같은 것과 동일한 것으로 볼 수 있다.

컴파일러란 이렇듯 문법에 맞는 문자열들을 파싱하여 함수와 같은 언어의 구성 요소들로 나누어주고, 나누어진 구성요소에 맞게 기계어로 바꾸어주는 도구이다!

앞으로 배울 것

지금까지 언급한 것을 중심으로 앞으로 무엇을 배울 것인지 알아보자.

  1. 먼저 프로그래밍 언어라는 것이 어떻게 정의되는지 알아보자.
  2. 다음으로 C 언어라는 제3외국어의 문법이 어떻게 정의되는지 살펴보자
  3. 문법에서의 요소들을 어떻게 쪼갤 수 있는지 알아보자
  4. 쪼갠 요소들을 어떻게 기계어로 바꿀 수 있는지 알아보자

위 주제들을 이해하고 컴파일러를 만들어보면 언어와 컴퓨터를 보는 시각이 완전히 달라질 것이라고 장담할 수 있다!!

하지만 그만큼 어렵고 배워야 할 것도 많은 주제이다. 앞으로 몇 년이 걸릴지 모르지만, 필자도 글을 끝까지 작성할 수 있도록 노력할 것이다.

단순한 컴파일러를 만들고 나면 조금 더 다양한 주제인 컴파일러 최적화와 같은 요소들을 살펴보는 것도 재미있을 것이다.